* GTK Calendar Widget
* Copyright (C) 1998 Cesar Miquel, Shawn T. Amundson and Mattias Groenlund
*
- * lib_date routines
- * Copyright (c) 1995, 1996, 1997, 1998 by Steffen Beyer
- *
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
#define TIMEOUT_INITIAL 500
#define TIMEOUT_REPEAT 50
-/***************************************************************************/
-/* The following date routines are taken from the lib_date package.
- * They have been minimally edited to avoid conflict with types defined
- * in win32 headers.
- */
-
static const guint month_length[2][13] =
{
{ 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
{ 0, 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 }
};
-static glong calc_days(guint year, guint mm, guint dd);
-static guint day_of_week(guint year, guint mm, guint dd);
-static glong dates_difference(guint year1, guint mm1, guint dd1,
- guint year2, guint mm2, guint dd2);
-static guint weeks_in_year(guint year);
-
static gboolean
leap (guint year)
{
- return((((year % 4) == 0) && ((year % 100) != 0)) || ((year % 400) == 0));
+ return ((((year % 4) == 0) && ((year % 100) != 0)) || ((year % 400) == 0));
}
static guint
day_of_week (guint year, guint mm, guint dd)
{
- glong days;
-
- days = calc_days(year, mm, dd);
- if (days > 0L)
- {
- days--;
- days %= 7L;
- days++;
- }
- return( (guint) days );
-}
+ GDateTime *dt;
+ guint days;
-static guint weeks_in_year(guint year)
-{
- return(52 + ((day_of_week(year,1,1)==4) || (day_of_week(year,12,31)==4)));
-}
+ dt = g_date_time_new_local (year, mm, dd, 1, 1, 1);
+ days = g_date_time_get_day_of_week (dt);
+ g_date_time_unref (dt);
-static gboolean
-check_date(guint year, guint mm, guint dd)
-{
- if (year < 1) return FALSE;
- if ((mm < 1) || (mm > 12)) return FALSE;
- if ((dd < 1) || (dd > month_length[leap(year)][mm])) return FALSE;
- return TRUE;
+ return days;
}
static guint
-week_number(guint year, guint mm, guint dd)
-{
- guint first;
-
- first = day_of_week(year,1,1) - 1;
- return( (guint) ( (dates_difference(year,1,1, year,mm,dd) + first) / 7L ) +
- (first < 4) );
-}
-
-static glong
-year_to_days(guint year)
-{
- return( year * 365L + (year / 4) - (year / 100) + (year / 400) );
-}
-
-
-static glong
-calc_days(guint year, guint mm, guint dd)
+week_of_year (guint year, guint mm, guint dd)
{
- gboolean lp;
-
- if (year < 1) return(0L);
- if ((mm < 1) || (mm > 12)) return(0L);
- if ((dd < 1) || (dd > month_length[(lp = leap(year))][mm])) return(0L);
- return( year_to_days(--year) + days_in_months[lp][mm] + dd );
-}
+ GDateTime *dt;
+ guint week;
-static gboolean
-week_of_year(guint *week, guint *year, guint mm, guint dd)
-{
- if (check_date(*year,mm,dd))
- {
- *week = week_number(*year,mm,dd);
- if (*week == 0)
- *week = weeks_in_year(--(*year));
- else if (*week > weeks_in_year(*year))
- {
- *week = 1;
- (*year)++;
- }
- return TRUE;
- }
- return FALSE;
-}
+ dt = g_date_time_new_local (year, mm, dd, 1, 1, 1);
+ week = g_date_time_get_week_of_year (dt);
+ g_date_time_unref (dt);
-static glong
-dates_difference(guint year1, guint mm1, guint dd1,
- guint year2, guint mm2, guint dd2)
-{
- return( calc_days(year2, mm2, dd2) - calc_days(year1, mm1, dd1) );
+ return week;
}
-/*** END OF lib_date routines ********************************************/
-
/* Spacing around day/week headers and main area, inside those windows */
#define CALENDAR_MARGIN 0
/* Compute days of previous month */
if (month > 1)
- ndays_in_prev_month = month_length[leap (year)][month-1];
+ ndays_in_prev_month = month_length[leap (year)][month - 1];
else
- ndays_in_prev_month = month_length[leap (year)][12];
+ ndays_in_prev_month = month_length[leap (year - 1)][12];
day = ndays_in_prev_month - first_day + 1;
row = 0;
GtkCalendarPrivate *priv = calendar->priv;
GtkStyleContext *context;
GtkBorder padding, week_padding;
- guint week = 0, year;
gint row, x_loc, y_loc;
gint day_height;
char buffer[32];
for (row = 0; row < 6; row++)
{
- gboolean result;
+ gint year, month, week;
year = priv->year;
- if (priv->day[row][6] < 15 && row > 3 && priv->month == 11)
- year++;
+ month = priv->month + priv->day_month[row][6] - MONTH_CURRENT;
+
+ if (month < 0)
+ {
+ month += 12;
+ year -= 1;
+ }
+ else if (month > 11)
+ {
+ month -= 12;
+ year += 1;
+ }
+
+ month += 1;
- result = week_of_year (&week, &year,
- ((priv->day[row][6] < 15 && row > 3 ? 1 : 0)
- + priv->month) % 12 + 1, priv->day[row][6]);
- g_return_if_fail (result);
+ week = week_of_year (year, month, priv->day[row][6]);
/* Translators: this defines whether the week numbers should use
* localized digits or the ones used in English (0123...).